perm filename PUMA.SAI[11,ARG] blob sn#524120 filedate 1980-07-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN
C00003 00003	!  PEEK, POKE, PEEKARRAY, POKEARRAY, ALINIT
C00008 00004	!	program to talk to PUMA from 10 via DZ11
C00012 ENDMK
C⊗;
BEGIN

DEFINE	CRLF="('15&'12)",
	! = "COMMENT ",
	TIL="STEP 1 UNTIL";

INTEGER ELFCHAN;  !  Channel number for I/O to ELF;
EXTERNAL INTEGER _SKIP_;

DEFINE SGNEXT="'4000000";	! extend sign bit of input data ;
DEFINE OWPW   ="0";		! word for word transfer;
DEFINE TWRJ   ="'1000000";	! two words per word,right justified in each halfword;
DEFINE TWRM   ="'2000000";	! two words per word,in right most 32 bits;
DEFINE TWLM   ="'3000000";	! two words per word,in left most 32 bits;

!  PEEK, POKE, PEEKARRAY, POKEARRAY, ALINIT;

SIMPLE INTEGER PROCEDURE CALLU0(STRING UUO;INTEGER AC;REFERENCE INTEGER ADDR);
   BEGIN
    INTEGER UUOCODE;
    UUOCODE←CALL(CVSIX(UUO),"CALLIT");
    IF UUOCODE=0 THEN PRINT("NO SUCH UUO: ",UUO)
	ELSE RETURN(CODE(UUOCODE+(AC LSH 23),ADDR));
   END;

SIMPLE INTEGER PROCEDURE IOWD(INTEGER N,LOC);
    RETURN(((-N)LAND '777777)LSH 18 +(LOC-1));

INTEGER MTAPE_PLUS_ELF;
DEFINE ELFMTAPE(ADDR)="CODE(MTAPE_PLUS_ELF,ADDR)";
! peek,poke and peekarray take the actual address on the unibus;

INTEGER PROCEDURE PEEK(INTEGER ADR);
    BEGIN "peek"  !  Returns the ELF word at unibus address ADR;
    INTEGER ARRAY A[1:2];
    DEFINE PEEK = "'002000000000";
    A[1]←PEEK+(ADR LSH -1);
    !	   CALLU0("MTAPE",ELFCHAN,A[1]);
    ELFMTAPE(A[1]);
    IF NOT _SKIP_ THEN USERERR(0,1,"Couldn't peek at ELF");
    RETURN(A[2]);
    END "peek";

PROCEDURE POKE(INTEGER ADR, CONTENTS);
    BEGIN "poke"  !  Stores CONTENTS at unibus address ADR;
    DEFINE POKE = "'003000000000";
    INTEGER ARRAY A[1:2];
    A[1]←POKE+(ADR LSH -1);
    A[2]←CONTENTS;
!   CALLU0("MTAPE",ELFCHAN,A[1]);
    ELFMTAPE(A[1]);
    IF NOT _SKIP_ THEN USERERR(0,1,"Couldn't poke at ELF");
    END "poke";

PROCEDURE POKEARRAY(INTEGER ADR, LTH; INTEGER ARRAY CONTENTS; INTEGER USETBITS(0));
    BEGIN "pokearray" !  Sends the CONTENTS[1:LTH] to unibus address ADR
		    and higher;
    INTEGER USETO_WORD,SNDIOWD;
    USETO_WORD←'400010400000 + (ADR LSH -1)+USETBITS;
    CALLU0("USETO",ELFCHAN,USETO_WORD);
    SNDIOWD←IOWD(LTH,LOCATION(CONTENTS[1]));
    CALLU0("OUT",ELFCHAN,SNDIOWD);
    IF _SKIP_ THEN USERERR(0,1,"POKEARRAY failed");
    END "pokearray";

PROCEDURE PEEKARRAY(INTEGER ADR, LTH; INTEGER ARRAY CONTENTS; INTEGER USETBITS(0));
    BEGIN "peekarray" !  Gets the CONTENTS[1:LTH] from unibus address ADR
	    and higher;
    INTEGER USETI_WORD,GETIOWD;
    USETI_WORD←'400010400000 +(ADR LSH -1)+USETBITS;
    CALLU0("USETI",ELFCHAN,USETI_WORD);
    GETIOWD←IOWD(LTH,LOCATION(CONTENTS[1]));
    CALLU0("IN",ELFCHAN,GETIOWD);
    IF _SKIP_ THEN USERERR(0,1,"PEEKARRAY failed");
    END "peekarray";

INTERNAL PROCEDURE ALINIT;
    BEGIN "init" 
    INTEGER COUNT, BRCHAR, EOF, FLAG;
    INTEGER I;
    !  Initialize the ELF for output;
    !  '400 on in mode word  and EOF←1 to take silent return if not available;
    EOF←1;
    OPEN(ELFCHAN←GETCHAN,"ELF",'417,0,0,COUNT,BRCHAR,EOF);
    IF EOF THEN BEGIN PRINT("ELF is not available."); CALL(0,"EXIT") END;
    MTAPE_PLUS_ELF←'072000000000+(ELFCHAN LSH 23);
    END "init";

!	program to talk to PUMA from 10 via DZ11;

INTEGER line,i,j,char,idle;

! DZ11 definitions;

DEFINE DZCSR  = "'760000";	! Control and Status register;
DEFINE DZLPR  = "'760002";	! Line Parameter register      (write only);
DEFINE DZRBUF = "'760002";	! Receiver Buffer register     (read  only);
DEFINE DZTCR  = "'760004";	! Transmitter Control register (byte);
DEFINE DZTBUF = "'760006";	! Transmitter Buffer	       (byte, write only);


PROCEDURE DZINIT;		! Set up the DZ11 using line # in LINE;
  BEGIN
  INTEGER i;
  POKE(DZCSR,'20);		! Reset DZ11;
  CALL(0,"SLEEP");		! Sleep for 1 tick;
  i ← '12430 + line;		! Line parameters: 300 baud, 8 char, no parity;
  POKE(DZLPR,i);		! Tell DZ11 what parameters to use;
  i ← 1 LSH line;		! Set up transmit bit for line we're using;
  POKE(DZTCR,i);		! Turn on transmit for line;
  POKE(DZCSR,'40);		! Turn on master scan enable;
  END;

alinit;

PRINT(crlf & "PUMA Terminal program"&crlf&crlf);

! PRINT("Which line do you want? (0-7): ");
line ← 0; ! CVD(INCHWL) LAND 7;

define ctlv   = "'047000400001";
define setact = "'051640000000";

  quick_code
  label tab,xit;
  ctlv ;		! this turns on the no echo bit;
  hrlzi 1,tab;
  setact 1;		! get old activation table;
  hrrzi 1,tab;
  hrrzi 2,'20;
  iorm 2,3(1);		! make bs activate;
  setact 1;		! make new table;
  jrst xit;
tab: 0;0;0;0;
xit:
  end;

DZINIT;

WHILE TRUE DO
  BEGIN						! Now talk;
  IF (char ← INCHRS) ≥ 0 AND char≠'12 THEN
    BEGIN					! Send char to PUMA;
    DO i ← PEEK(DZCSR) UNTIL i LAND '100000;	! Wait til transmitter ready;
    IF ¬(i LAND '40) THEN DZINIT;		! DZ11 zapped, re-enable it;
    char ← char LAND '177;
    POKE(DZTBUF,char);
    idle ← 0;
    END;

  j ← PEEK(DZRBUF);		! Anything to write?;
  IF j LAND '100000 THEN
    BEGIN			! Write char from PUMA;
    j ← j LAND '177;
    IF j = '10 THEN j ← '177;		! Convert ASCII bs to null;
    IF j ≠ '26 THEN OUTCHR( j );	! Don't print ⊗ from VAL;
    idle ← 0;
    END;

  IF idle THEN CALL(0,"SLEEP");	! Sleep for 1 tick;
  idle ← idle + 1;
  IF idle = 20000 THEN PRINT(crlf & "Are you still there???" & crlf);
  IF idle ≥ 36000 THEN
    BEGIN
    PRINT("Auto-exit!!!" & crlf);
    POKE(DZCSR,'20);		! Reset DZ11;
    CALL(0,"EXIT");
    END;
  END;

END;